查看原文
其他

如何在20分钟内批量部署20台 ESXi 服务器? | 运维进阶

zhufeng twt企业IT社区 2022-07-03

【作者】陈著峰,某银行主机管理员


近期新到20台华为RH2288V5服务器,需要部署ESXi,由于机器较多,于是考虑是否能用pxe实现批量部署,经过两天的摸索实践,最终也实现了上述目标,现记录一下过程。

先介绍一下背景。此次新到的RH2288V5,前面没有配硬盘,只在后面PCI卡位置配了一块M2的SSD。经过查看BIOS,机器配了两块RAID卡,一块用于管理前硬盘背板,另外一块用于管理PCI槽位的M2 SSD。服务器默认的RAID配置,没有划分VD,配的唯一一块SSD配为Unconfigure Good状态,且RAID控制器没有开启JBOD模式。

由于整机只配了一块SSD,RAID卡要么把这唯一的一块SSD划分一个RAID0的VD,要么开启RAID控制器的JBOD模式让这块SSD以直通模式被操作系统识别。那么问题来了,如何批量修改这一批机器的RAID呢?分别接显示器进BIOS一台台配RAID显然不是最好的办法,费时费力。需要说明的是,华为RH2288V5服务器默认是开启了UEFI引导的,基本上各大品牌现在新出的服务器,都是默认UEFI模式了。

经过一番搜寻,发现Broadcom提供了一个叫StorCLI的命令行工具,这个工具可以实现对RAID卡所有的配置,下载地址https://docs.broadcom.com/docs/MR_SAS_Unified_StorCLI_7.8-007.0813.0000.0000.zip。那是否能通过pxe引导一个live模式的linux,然后自动运行storecli把控制器JBOD模式启用起来呢?目标是在最短的时间内实现批量配置RAID,所以最好是拿一个开箱即用的linux,不能涉及到复杂的修改或定制linux启动介质等工作,最终经过一番测试后在clonezilla上实现了所需的功能。

clonezilla是一个基于debian/ubuntu修改的发行版,不带图形界面,其主要用途其实是备份/恢复系统,那为什么会选择用它呢?首先是这个发行版体积比较小,整个ISO只有不到300M;其次最重要的是它支持在grub的内核参数传入一些它自定义的参数,来实现很多额外的功能,其中最重要是有我们需要的直接运行命令的参数!

版本使用是用的 clonezilla-live-20180812-bionic-amd64.iso,它是基于ubuntu 18.04LTS修改而来。下载地址:https://sourceforge.net/projects/clonezilla/files/clonezilla_live_alternative/

让我们首先来详细分析如何使用pxe+clonezilla+storcli实现批量配置服务器RAID。

1、首先需要准备一台RHEL7的虚拟机(当然你要喜欢的话用物理机也行,网络能通就行),这台机用于提供dhcp+tftp+nfs服务,这些服务都需要先配置好,具体关于如何配置以及PXE引导更多的内容,可以参考我的上一篇文章。在这篇文章中,用于dhcpd分配IP的是虚拟机第二块网卡,地址配的是192.168.3.1,网段当然就是192.168.3.0了。

2、准备前期所需的脚本及storcli主程序。本文使用的NFS目录为/nfs/pxe,在这个目录里面,准备好3个文件,分别是jbod.sh,storcli64,ks_esxi.cfg。

jbod.sh用于clonezilla引导成功之后,通过该脚本来执行storcli配RAID,该文件内容如下:

echo "";echo "**** Ready to run StorCli! ****";echo "";sleep 5;
sudo /opt/storcli64 /c1 set jbod=on;sleep 5;echo "";sudo /opt/storcli64 show;sleep 10;
echo "";echo "**** Going to REBOOT NOW! ****";echo "";sleep 5;sudo reboot;

这里需要解释两条命令。

storcli64 show
是查看当前系统的RAID卡基本信息,RH2288V5配的两个RAID卡会显示为第0块和第1块RAID控制器,M2 SSD所在的RAID卡为第1块。

storcli64 /c1 set jbod=on
是指将第1块RAID卡的jbod功能设为on,即打开接了M2 SSD的RAID卡的JBOD功能。


storcli64为主程序,这个文件需要从storcli的包解压出来,从压缩包里面的ubuntu或linux目录里面的deb/rpm包提取均可(可使用7zip来解压提取)。

ks_esxi.cfg为esxi自动kickstart部署用的,配RAID这个过程用不到,先创建备用。

3、准备使用PXE引导clonezilla。下载好clonezilla的ISO,将它解压到/var/lib/tftpboot/images/clonezilla目录,然后把RHEL7的grubx64.efi拷到上述目录并创建grub的配置文件grub.cfg。(至于为什么不直接使用clonezilla的ISO自带的grubx64.efi,是因为实测它自带的grubx64.efi无论如何都不认grub.cfg的配置文件,也可能是我放的路径不对吧)。

如果RHEL7是使用传统的非EFI模式安装的,那么就需要去RHEL7的ISO里面提取grubx64.efi,提取方法上一篇文章里面有写。然后把/etc/dhcp/dhcpd.conf里面定义的启动文件修改为:filename "images/clonezilla/grubx64.efi" 。

cp /boot/efi/EFI/redhat/grubx64.efi /var/lib/tftpboot/images/clonezillatouch /var/lib/tftpboot/images/clonezilla/grub.cfg

4、配置PXE引导clonezilla。grub.cfg的完整内容如下:

set default=0set timeout=3menuentry "Clonezilla live (Default settings, VGA 1024x768)"{ linuxefi images/clonezilla/live/vmlinuz boot=live union=overlay username=user hostname=bionic config components noswap edd=on nomodeset locales= keyboard-layouts=NONE ocs_live_run="/opt/jbod.sh" ocs_live_batch="no" ip= net.ifnames=0 vmwgfx.enable_fbdev=1 fetch=tftp://192.168.3.1/images/clonezilla/live/filesystem.squashfs ocs_preload="mount -t nfs 192.168.3.1:/nfs/pxe /tmp/nfs" vga=791 initrdefi images/clonezilla/live/initrd.img}

上面这些参数其实是从clonezilla自带的grub.cfg修改而来的,需要解释的参数有如下几个(跟自带的grub.cfg一样的地方就不解释了):

ocs_live_run="/opt/jbod.sh"
这个是指clonezilla引导完成后直接自动执行/opt/jbod.sh,而不是自带的clonezilla备份恢复菜单。

fetch=tftp://192.168.3.1/images/clonezilla/live/filesystem.squashfs
这个是让clonezilla以tftp协议获取192.168.3.1/images/clonezilla/live/filesystem.squashfs文件,这个文件是上一步已经解压出来的,这个文件是用于提供liveOS的文件系统镜像(即普通linux的根目录下面的所有文件打的包)。

ocs_preload="mount -t nfs 192.168.3.1:/nfs/pxe /tmp/nfs"
这个是指clonezilla引导完成之前先挂载192.168.3.1:/nfs/pxe的NFS目录到/tmp/nfs,clonezilla会自动把ocs_preload后面跟的NFS目录内的所有文件都拷到/opt目录里面去,现在明白为什么jbod.sh脚本里面要用sudo /opt/storcli64 了吧?


5、上述工作都准备好之后,启动或重启RHEL7虚拟机的dhcpd/xinetd/nfs服务,然后把20台服务器都接上网线(建议先只接唯一的一条用于DHCP+PXE的网线,其它网线先不要接),注意一定要跟上面的RHEL7虚拟机的网络要通,要让这些服务器获取到RHEL7虚拟机DHCP分配出来的IP地址。

然后就可以把20台服务器都开机了,DHCP获取到地址之后会通过PXE使用tftp获取grubx64.efi引导文件和grub.cfg配置文件,然后引导grub,读取配置文件并按配好的内核参数引导clonezilla,自动挂载RHEL7虚拟机的/nfs/pxe目录并把该目录里的3个文件拷到/opt中,然后会执行/opt/jbod.sh脚本,即调用storcli64将SSD所在RAID卡JBOD功能打开,最后自动重启服务器(机器自动重启之后仍然会继续从PXE引导并再次执行jbod.sh,这个不会对RAID配置有什么影响)。

以下部分是RHEL7虚拟机上的/var/log/messages执行DHCP分配引导clonezilla的部分日志:

Mar 7 21:19:21 RHEL76 dhcpd: DHCPDISCOVER from 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:22 RHEL76 dhcpd: DHCPOFFER on 192.168.3.16 to 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:24 RHEL76 dhcpd: DHCPREQUEST for 192.168.3.16 (192.168.3.1) from 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:24 RHEL76 dhcpd: DHCPACK on 192.168.3.16 to 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:24 RHEL76 xinetd[7426]: START: tftp pid=8860 from=192.168.3.16Mar 7 21:19:24 RHEL76 in.tftpd[8861]: Error code 8: User aborted the transferMar 7 21:19:25 RHEL76 in.tftpd[8862]: Client 192.168.3.16 finished images/clonezilla/grubx64.efiMar 7 21:19:25 RHEL76 in.tftpd[8872]: Client 192.168.3.16 finished /images/clonezilla/grub.cfgMar 7 21:19:25 RHEL76 in.tftpd[8877]: Client 192.168.3.16 finished /images/clonezilla/grub.cfgMar 7 21:19:30 RHEL76 in.tftpd[8879]: Client 192.168.3.16 finished images/clonezilla/live/vmlinuzMar 7 21:19:39 RHEL76 in.tftpd[8880]: Client 192.168.3.16 finished images/clonezilla/live/initrd.imgMar 7 21:19:45 RHEL76 dhcpd: DHCPDISCOVER from 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:45 RHEL76 dhcpd: DHCPOFFER on 192.168.3.16 to 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:45 RHEL76 dhcpd: DHCPREQUEST for 192.168.3.16 (192.168.3.1) from 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:45 RHEL76 dhcpd: DHCPACK on 192.168.3.16 to 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:50 RHEL76 in.tftpd[8882]: Client 192.168.3.16 finished /images/clonezilla/live/filesystem.squashfs

jbod.sh在clonezilla自动执行的结果大概如下图所示:

(截图为虚拟机内测试运行的结果,由于没有RAID卡所以会报not found,实际在服务器上跑的时候下面会输出JBOD enabled之类的日志)

关于clonezilla的PXE引导说明,以及clonezilla支持的内核参数说明,可以参考如下两个官方文档:

https://clonezilla.org/livepxe.php 
https://clonezilla.org/fine-print-live-doc.php?path=clonezilla-live/doc/99_Misc/00_live-boot-parameters.doc

接下来就轮到使用PXE+Kickstart来批量自动部署ESXi了。

RAID配成JBOD之后,系统已经能认到SSD了,现在该批量部署ESXi了。

1、准备好esxi的ISO,把ISO里面的所有文件都拷到RHEL7虚拟机的 /var/lib/tftpboot/images/esx60u3 目录。然后把ISO自带的efi文件拷到当前目录。

cd /var/lib/tftpboot/images/esxi60u3cp efi/boot/bootx64.efi .

2、编辑 /var/lib/tftpboot/images/esx60u3/boot.cfg,这个文件是esxi引导efi的配置文件。

主要需要修改2个地方,第一个是把kernel=和modules=后面跟的内容的/全部去掉,modules一行里面包含的/比较多,如果编辑用的是vim,可以用如下命令快速全部替换 :%s////g ,或者用如下命令 sed -i 's////g' /var/lib/tftpboot/images/esxi60u3/boot.cfg ;第二个是添加kickstart路径的参数,在 kernelopt=runweasel 后面加上 ks=nfs://192.168.3.1/nfs/pxe/ks_esxi.cfg ,即让安装程序从192.168.3.1的/nfs/pxe/ks_esxi.cfg获取kickstart自动安装配置文件。

修改完之后保存,文件内容大概类似如下这样:

bootstate=0title=Loading ESXi installertimeout=2kernel=tboot.b00kernelopt=runweasel ks=nfs://192.168.3.1/nfs/pxe/ks_esxi.cfgmodules=b.b00 --- jumpstrt.gz --- useropts.gz --- k.b00 --- chardevs.b00 --- a.b00 --- user.b00 --- uc_intel.b00 --- uc_amd.b00 --- sb.v00 --- s.v00 --- lsi_mr3.v00 --- lsi_msgp.v00 --- lsi_msgp.v01 --- bnxtnet.v00 --- net_tg3.v00 --- brcmfcoe.v00 --- elxnet.v00 --- ima_be2i.v00 --- lpfc.v00 --- scsi_be2.v00 --- i40en.v00 --- igbn.v00 --- ixgben.v00 --- concrete.v00 --- filetran.v00 --- fupb.v00 --- fwupdate.v00 --- immpasst.v00 --- pciinfo.v00 --- nmlx4_co.v00 --- nmlx4_en.v00 --- nmlx4_rd.v00 --- nmlx5_co.v00 --- qedentv.v00 --- qedf.v00 --- scsi_qed.v00 --- misc_cni.v00 --- net_bnx2.v00 --- net_bnx2.v01 --- net_cnic.v00 --- qlnative.v00 --- scsi_bnx.v00 --- scsi_bnx.v01 --- mtip32xx.v00 --- ata_pata.v00 --- ata_pata.v01 --- ata_pata.v02 --- ata_pata.v03 --- ata_pata.v04 --- ata_pata.v05 --- ata_pata.v06 --- ata_pata.v07 --- block_cc.v00 --- ehci_ehc.v00 --- emulex_e.v00 --- weaselin.t00 --- esx_dvfi.v00 --- esx_ui.v00 --- ima_qla4.v00 --- ipmi_ipm.v00 --- ipmi_ipm.v01 --- ipmi_ipm.v02 --- lsu_hp_h.v00 --- lsu_lsi_.v00 --- lsu_lsi_.v01 --- lsu_lsi_.v02 --- lsu_lsi_.v03 --- lsu_lsi_.v04 --- misc_dri.v00 --- net_e100.v00 --- net_e100.v01 --- net_enic.v00 --- net_forc.v00 --- net_igb.v00 --- net_mlx4.v00 --- net_mlx4.v01 --- net_nx_n.v00 --- net_vmxn.v00 --- nvme.v00 --- ohci_usb.v00 --- rste.v00 --- sata_ahc.v00 --- sata_ata.v00 --- sata_sat.v00 --- sata_sat.v01 --- sata_sat.v02 --- sata_sat.v03 --- sata_sat.v04 --- scsi_aac.v00 --- scsi_adp.v00 --- scsi_aic.v00 --- scsi_fni.v00 --- scsi_hps.v00 --- scsi_ips.v00 --- scsi_meg.v00 --- scsi_meg.v01 --- scsi_meg.v02 --- scsi_mpt.v00 --- scsi_mpt.v01 --- scsi_mpt.v02 --- scsi_qla.v00 --- uhci_usb.v00 --- vsan.v00 --- vsanheal.v00 --- vsanmgmt.v00 --- xhci_xhc.v00 --- tools.t00 --- lnvcusto.v00 --- xorg.v00 --- imgdb.tgz --- imgpayld.tgzbuild=updated=0

3、修改esxi的kickstart配置文件 /nfs/pxe/ks_esxi.cfg,内容很简单,这个配置只定义了接受用户协议,在第一块硬盘执行覆盖安装,设置root密码为abcd1234并在安装完成后自动重启。

accepteulainstall --firstdisk --overwritevmfsrootpw abcd1234reboot

4、修改 /etc/dhcp/dhcpd.conf ,由原来的 filename "images/clonezilla/grubx64.efi" 改成 filename "images/esxi60u3/bootx64.efi",然后重启 dhcpd服务。dhcpd服务重启完之后,机器在clonezilla执行完jbod.sh重启之后就会开始自动获取esxi的efi引导文件,并开始自动进行esxi的批量安装部署了。

在安装完成之后服务器会自动重启,然后会自动引导刚安装完的esxi,因为安装esxi之后会生成esxi的efi引导项,服务器在没有引导项的时候才会从网卡PXE启动。

最后来总结一下,此次实施主要是利用PXE,先引导一个live模式的linux全自动运行storcli来修改RAID配置,然后利用PXE引导esxi安装程序通过kickstart进行全自动esxi安装部署。

storcli 的功能非常强大,本文中只用到了它开始RAID控制器jbod模式的功能,划分RAID配VD等这些都不在话下,有兴趣可以看一下broadcom官网的文档。

如有任何问题,可点击文末阅读原文到社区原文下评论交流
本文获授权发布,如无授权请勿转载


欢迎关注社区 “系统运维”技术主题,将会不断更新优质资料、文章。地址:

http://www.talkwithtrend.com/Topic/199

下载 twt 社区客户端 APP

与更多同行在一起

高手随时解答你的疑难问题

轻松订阅各领域技术主题

浏览下载最新文章资料


长按识别二维码即可下载

或到应用商店搜索“twt”


长按二维码关注公众号

*本公众号所发布内容仅代表作者观点,不代表社区立场

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存